package cn.tips.dmp.supports.httplog;//package cn.tips.dmp.supports.httplog;
//
//import com.fasterxml.jackson.annotation.JsonRawValue;
//import com.fasterxml.jackson.annotation.JsonValue;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import lombok.AllArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//import org.zalando.logbook.*;
//
//import java.io.IOException;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.Optional;
//
///**
// * 合并request请求至response中,用于合并成一条日志,交由HttpLogWriter处理
// *
// * @author pkb
// * created on 2020/3/27
// */
//@SuppressWarnings("NullableProblems")
//@Component
//@Slf4j
//public class CombineSink implements Sink {
//
//    private ObjectMapper mapper = new ObjectMapper();
//
//    private final HttpLogWriter writer;
//
//    public CombineSink(HttpLogWriter writer) {
//        this.writer = writer;
//    }
//
//    @Override
//    public void write(Precorrelation precorrelation, HttpRequest request) {
//        // 此处不做任何操作,因为我们将request日志延迟到response中一起处理
//    }
//
//    @Override
//    public void write(Correlation correlation, HttpRequest request, HttpResponse response) {
//        // 在此处进行拓展,实现request与response合并为一条日志操作
//        // 具体更多参数可以参考org.zalando.logbook.HttpRequest与org.zalando.logbook.HttpResponse中属性
//        // 解析jsonBody对象
//        try {
//            Object reqBodyObj = prepareBody(request.getContentType(), request.getBodyAsString()).orElse(null);
//            Object respBodyObj = prepareBody(response.getContentType(), response.getBodyAsString()).orElse(null);
//
//            // 封装请求信息对象
//            HttpRequestLogInfo requestInfo = HttpRequestLogInfo.builder()
//                    .remote(request.getRemote())
//                    .uri(request.getRequestUri())
//                    .protocol(request.getProtocolVersion())
//                    .method(request.getMethod())
//                    .charset(request.getCharset())
//                    .headers(request.getHeaders())
//                    .body(reqBodyObj)
//                    .build();
//
//            // 封装返回信息对象
//            HttpResponseLogInfo responseInfo = HttpResponseLogInfo.builder()
//                    .duration(correlation.getDuration().toMillis())
//                    .protocol(response.getProtocolVersion())
//                    .status(response.getStatus())
//                    .charset(response.getCharset())
//                    .headers(response.getHeaders())
//                    .body(respBodyObj)
//                    .build();
//
//            HttpLogInfo httpLogInfo = HttpLogInfo.builder()
//                    .opTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")))
//                    .requestInfo(requestInfo)
//                    .responseInfo(responseInfo)
//                    .build();
//
//            writer.write(correlation, mapper.writeValueAsString(httpLogInfo));
//        } catch (IOException e) {
//            log.debug("相关请求与返回已在httplog日志filter之前已经处理完成,不进行日志记录处理!");
//        }
//    }
//
//    /**
//     * 解析请求中的body字符串为对象
//     *
//     * @param contentType contentType
//     * @param bodyStr     body字符串
//     * @return Optional
//     */
//    private Optional<Object> prepareBody(String contentType, String bodyStr) {
//        if (bodyStr.isEmpty()) {
//            return Optional.empty();
//        }
//
//        if (JsonMediaTypeHelper.JSON.test(contentType)) {
//            // TODO has this JSON been validated? If not then this might result in invalid log statements
//            return Optional.of(new CombineSink.JsonBody(bodyStr));
//        } else {
//            return Optional.of(bodyStr);
//        }
//    }
//
//    @AllArgsConstructor
//    private static final class JsonBody {
//        String json;
//
//        @JsonRawValue
//        @JsonValue
//        public String getJson() {
//            return json;
//        }
//    }
//}
